package org.come.Jpanel;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.plaf.basic.BasicInternalFrameUI;

import org.come.Frame.OptionsJframe;
import org.come.Frame.ZhuFrame;
import org.come.bean.LoginResult;
import org.come.until.FormsManagement;
import org.come.until.MessagrFlagUntil;
import org.come.until.Music;
import com.tool.role.RoleData;
import com.tool.btn.FormsOnOffBtn;
import com.tool.tcpimg.UIUtils;

public class AvatarSwitchFrame extends JInternalFrame implements MouseListener {
    private TeststateJpanel parentPanel;
    private JPanel contentPane;
    private JPanel avatarPanel;
    private List<AvatarButton> avatarButtons;
    private String currentStyle;

    // 鼠标拖拽相关变量
    private int first_x, first_y;

    // 定义四个不同的头像目录
    private static final String AVATAR_DIR_1 = "img/head";        // 经典头像
    private static final String AVATAR_DIR_2 = "img/newHead";     // 复古头像
    private static final String AVATAR_DIR_3 = "img/newHead/head-old";     // 老版头像
    private static final String AVATAR_DIR_4 = "img/newHead/head-baby";  // q版头像

    public AvatarSwitchFrame(TeststateJpanel parentPanel) {
        System.out.println("AvatarSwitchFrame 构造函数开始执行");
        this.parentPanel = parentPanel;
        this.currentStyle = com.updateNew.MyIsif.getStyle();

        // 设置窗口属性
        this.setBorder(BorderFactory.createEmptyBorder());// 去除内部窗体的边框
        ((BasicInternalFrameUI) this.getUI()).setNorthPane(null);// 去除顶部的边框
        this.setBackground(new Color(0, 0, 0, 0)); // 设置透明背景

        contentPane = new JPanel() {
            private ImageIcon backgroundIcon;

            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                // 根据当前UI风格使用不同的背景图片
                if (backgroundIcon == null) {
                    if ("水墨UI".equals(com.updateNew.MyIsif.getStyle())) {
                        backgroundIcon = new ImageIcon("inkImg/newbackground/头像更换1.png");
                    } else {
                        backgroundIcon = new ImageIcon("inkImg/hongmu/1/genghuan.png");
                    }
                }
                g.drawImage(backgroundIcon.getImage(), 0, 0, getWidth(), getHeight(), this);
            }
        };

        contentPane.setPreferredSize(new Dimension(520, 315));
        contentPane.setOpaque(false); // 设置为透明，使用背景图片
        contentPane.setLayout(null);
        this.setContentPane(contentPane);
        this.setBounds(50, 50, 520, 315);
        this.pack();
        this.setVisible(false);
        this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        this.addMouseListener(this);
        this.addMouseMotionListener(new MouseMotionListener() {
            @Override
            public void mouseMoved(MouseEvent e) {
                if (MessagrFlagUntil.ImgFlagImg.equals(MessagrFlagUntil.MOUSE13)) {
                    MessagrFlagUntil.setMouse(MessagrFlagUntil.MOUSE1);
                }
            }

            @Override
            public void mouseDragged(MouseEvent e) {
                if (isVisible()) {
                    int x = e.getX() - first_x;
                    int y = e.getY() - first_y;
                    // 和Teststatejframe一样，不添加边界限制，允许自由拖拽到整个游戏界面范围
                    setBounds(x + getX(), y + getY(), getWidth(), getHeight());
                }
            }
        });

        // 关闭按钮 - 调整位置以适应新背景
        FormsOnOffBtn offBtn = new FormsOnOffBtn("inkImg/old/2/1.png", 1, 0);
        offBtn.setBounds(520 - 30, 5, 25, 25);
        offBtn.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("点击了关闭按钮");
                // 关闭面板
                closePanel();
            }

            @Override
            public void mousePressed(MouseEvent e) {}

            @Override
            public void mouseReleased(MouseEvent e) {}

            @Override
            public void mouseEntered(MouseEvent e) {}

            @Override
            public void mouseExited(MouseEvent e) {}
        });
        contentPane.add(offBtn);

        // 头像展示面板
        avatarPanel = new JPanel();
        avatarPanel.setOpaque(false);
        avatarPanel.setLayout(null); // 使用null布局以便精确控制位置
        avatarPanel.setBounds(10, 35, 500, 270);
        avatarPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); // 边距
        contentPane.add(avatarPanel);

        System.out.println("AvatarSwitchFrame 构造函数执行完成");
    }

    // 重写 setVisible 方法，在每次显示时重新加载头像
    @Override
    public void setVisible(boolean visible) {
        if (visible) {
            // 在显示前重新加载头像，确保显示的是当前种族的头像
            loadAvatars();
        }
        super.setVisible(visible);
    }

    // 提供一个公共方法，用于在角色转换后刷新头像
    public void refreshAvatars() {
        if (isVisible()) {
            loadAvatars();
        }
    }

    // 关闭面板的方法
    public void closePanel() {
        System.out.println("关闭头像切换面板");
        FormsManagement.HideForm(199); // 使用一个特殊的ID来隐藏面板
    }

    private void loadAvatars() {
        // 清空面板
        avatarPanel.removeAll();

        // 初始化按钮列表
        avatarButtons = new ArrayList<>();

        // 获取当前角色信息
        final LoginResult login = RoleData.getRoleData().getLoginResult();
        int roleId = 1; // 默认种族ID
        int sex = 0;

        if (login != null) {
            // 安全地获取种族ID
            if (login.getSpecies_id() != null) {
                roleId = login.getSpecies_id().intValue();
            }

            // 安全地获取性别
            try {
                if (login.getSex() != null) {
                    sex = Integer.parseInt(login.getSex().toString());
                }
            } catch (Exception e) {
                sex = 0;
            }
        } else {
            System.out.println("警告: 无法获取角色信息，使用默认值");
        }

        // 为每组头像创建独立的面板并设置位置
        // 第一组头像 (经典头像)
        JPanel panel1 = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 5));
        panel1.setOpaque(false);
        panel1.setBounds(35, 21, 100, 250);
        loadAvatarsByRoleInfo(AVATAR_DIR_1, panel1, avatarButtons, roleId, sex, 1, "");
        avatarPanel.add(panel1);

        // 第二组头像 (新头像)
        JPanel panel2 = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 5));
        panel2.setOpaque(false);
        panel2.setBounds(155, 21, 100, 250);
        loadAvatarsByRoleInfo(AVATAR_DIR_2, panel2, avatarButtons, roleId, sex, 2, "");
        avatarPanel.add(panel2);

        // 第三组头像 (复古头像)
        JPanel panel3 = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 5));
        panel3.setOpaque(false);
        panel3.setBounds(267, 21, 100, 250);
        loadAvatarsByRoleInfo(AVATAR_DIR_3, panel3, avatarButtons, roleId, sex, 3, "");
        avatarPanel.add(panel3);

        // 第四组头像 (自定头像)
        JPanel panel4 = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 5));
        panel4.setOpaque(false);
        panel4.setBounds(383, 21, 100, 250);
        loadAvatarsByRoleInfo(AVATAR_DIR_4, panel4, avatarButtons, roleId, sex, 4, "");
        avatarPanel.add(panel4);

        // 更新界面
        avatarPanel.revalidate();
        avatarPanel.repaint();
    }
    // 创建并添加头像类型面板的辅助方法
    private void createAndAddAvatarTypePanel(JPanel mainPanel, String typeName, String directoryPath, int type,
                                             int roleId, int sex, List<AvatarButton> buttonList) {
        // 外层面板
        JPanel typePanel = new JPanel();
        typePanel.setOpaque(false);
        typePanel.setLayout(new BoxLayout(typePanel, BoxLayout.Y_AXIS));

        // 头像网格面板
        JPanel avatarGrid = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 5));
        avatarGrid.setOpaque(false);
        loadAvatarsByRoleInfo(directoryPath, avatarGrid, buttonList, roleId, sex, type, typeName);
        typePanel.add(avatarGrid);

        // 添加到主面板
        mainPanel.add(typePanel);
    }

    private void loadAvatarsByRoleInfo(String directoryPath, JPanel panel, List<AvatarButton> buttonList, int roleId, int sex, int type, String styleName) {
        File directory = new File(directoryPath);
        if (!directory.exists() || !directory.isDirectory()) {
            // 不在游戏内显示错误信息，只在调试控制台输出
            System.out.println("目录不存在: " + directoryPath);
            return;
        }

        // 直接使用角色ID作为文件名，不加"P"前缀
        String fileName = roleId + ".png";

        // 查找对应的头像文件
        File avatarFile = new File(directory, fileName);
        if (avatarFile.exists()) {
            try {
                AvatarButton avatarBtn = new AvatarButton(new ImageIcon(avatarFile.getPath()), avatarFile.getPath(), type, styleName);
                avatarBtn.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        // 添加确认对话框和费用检查
                        final LoginResult login = RoleData.getRoleData().getLoginResult();
                        if (login != null) {
                            // 检查是否有足够的大话币（10000）
                            if (login.getGold() == null || login.getGold().longValue() < 10000) {
                                // 提示大话币不足
                                if (ZhuFrame.getZhuJpanel() != null) {
                                    ZhuFrame.getZhuJpanel().addPrompt2("大话币不足，无法更换头像！");
                                }
                                return;
                            }

                            // 显示确认对话框
                            int option = JOptionPane.showConfirmDialog(
                                    SwingUtilities.windowForComponent(AvatarSwitchFrame.this),
                                    "更换头像需要消耗10000大话币，是否确定更换？",
                                    "头像更换确认",
                                    JOptionPane.YES_NO_OPTION,
                                    JOptionPane.QUESTION_MESSAGE
                            );

                            if (option == JOptionPane.YES_OPTION) {
                                // 扣除大话币
                                long currentGold = login.getGold().longValue();
                                login.setGold(new java.math.BigDecimal(currentGold - 10000));

                                // 更新主面板的头像
                                if (parentPanel != null) {
                                    parentPanel.updateAvatar(avatarFile.getPath());
                                }
                                // 同时更新角色数据中的头像信息，确保全局更新
                                updateRoleAvatar(avatarFile.getPath());
                                // 关闭面板
                                closePanel();

                                // 提示更换成功
                                if (ZhuFrame.getZhuJpanel() != null) {
                                    ZhuFrame.getZhuJpanel().addPrompt2("头像更换成功，已扣除10000大话币！");
                                }
                            }
                        }
                    }
                });

                panel.add(avatarBtn);
                buttonList.add(avatarBtn);
            } catch (Exception e) {
                e.printStackTrace();
                // 不在游戏内显示错误信息，只在调试控制台输出
                System.out.println("头像加载失败");
            }
        } else {
            // 如果文件不存在，不在游戏内显示提示信息，只在调试控制台输出
            System.out.println("未找到头像: " + fileName);
        }
    }

    // 根据角色ID和性别生成可能的头像文件名
    private List<String> generateAvatarFileNames(int roleId, int sex) {
        List<String> fileNames = new ArrayList<>();

        // 根据常见的命名规则生成文件名
        // 带性别的文件名
        fileNames.add("p" + roleId + "_" + sex + ".png");
        fileNames.add("p" + roleId + "_" + sex + ".jpg");
        fileNames.add(roleId + "_" + sex + ".png");
        fileNames.add(roleId + "_" + sex + ".jpg");

        // 不带性别的文件名
        fileNames.add("p" + roleId + ".png");
        fileNames.add("p" + roleId + ".jpg");
        fileNames.add(roleId + ".png");
        fileNames.add(roleId + ".jpg");

        // 添加一些常见的默认头像文件名
        fileNames.add("default.png");
        fileNames.add("default_male.png");
        fileNames.add("default_female.png");

        return fileNames;
    }

    // 更新角色数据中的头像信息，确保全局更新
    private void updateRoleAvatar(String avatarPath) {
        try {
            // 获取当前角色数据
            final LoginResult login = RoleData.getRoleData().getLoginResult();
            if (login != null) {
                // 更新角色数据中的头像路径
                // 这里需要根据你的实际数据结构来确定如何保存头像路径
                // 假设有一个方法可以设置头像路径
                // login.setAvatarPath(avatarPath); // 这行代码需要根据实际的数据结构来实现

                // 发送网络请求到服务器，更新服务器端的头像信息
                // 这样当其他地方重新获取角色信息时，会得到最新的头像
                // 使用通用的消息格式发送头像更新请求
                String message = "AvatarChange#" + avatarPath;
                org.come.socket.SendMessageUntil.toServer(message);

                // 如果有其他需要立即更新的界面组件，可以在这里添加相应代码
                // 例如：更新任务面板、聊天窗口等处的头像显示
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
        // 关闭音效
        Music.addyinxiao("关闭窗口.mp3");
        // 打开了窗体
        if (e.isMetaDown()) {// 检测鼠标右键单击
            FormsManagement.HideForm(199);
        } else {
            FormsManagement.Switchinglevel(199);
        }

        this.first_x = e.getX();
        this.first_y = e.getY();
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    // 自定义头像按钮类
    class AvatarButton extends JButton {
        private String avatarPath;
        private int type;
        private String styleName;

        public AvatarButton(ImageIcon icon, String avatarPath, int type, String styleName) {
            super(icon);
            this.avatarPath = avatarPath;
            this.type = type;
            this.styleName = styleName;
            // 保持头像按钮大小为75x100
            setPreferredSize(new Dimension(75, 100));
            setMargin(new Insets(2, 2, 2, 2));
            setBorder(BorderFactory.createLineBorder(Color.GRAY, 1));
            setContentAreaFilled(false);
            setFocusPainted(false);
            setOpaque(false);

            // 缩放图片以适应按钮大小
            if (icon != null && icon.getImage() != null) {
                Image img = icon.getImage();
                Image scaledImg = img.getScaledInstance(75, 100, Image.SCALE_SMOOTH);
                setIcon(new ImageIcon(scaledImg));
            }
        }

        public String getAvatarPath() {
            return avatarPath;
        }

        public int getType() {
            return type;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            // 绘制背景
            if (getModel().isPressed()) {
                g.setColor(new Color(0, 0, 0, 100));
                g.fillRect(0, 0, getWidth(), getHeight());
            } else if (getModel().isRollover()) {
                g.setColor(new Color(255, 255, 255, 100));
                g.fillRect(0, 0, getWidth(), getHeight());
            }

            // 绘制风格标签
            if (styleName != null && !styleName.isEmpty()) {
                FontMetrics fm = g.getFontMetrics();
                int textWidth = fm.stringWidth(styleName);
                int textX = (getWidth() - textWidth) / 2;
                int textY = getHeight() - 15; // 调整标签位置

                g.setColor(Color.WHITE);
                g.setFont(new Font("微软雅黑", Font.PLAIN, 12));
                g.drawString(styleName, textX, textY);
            }
        }

        // 重写equals方法，防止添加重复的头像按钮
        @Override
        public boolean equals(Object obj) {
            if (this == obj) return true;
            if (obj == null || getClass() != obj.getClass()) return false;
            AvatarButton that = (AvatarButton) obj;
            return avatarPath != null ? avatarPath.equals(that.avatarPath) : that.avatarPath == null;
        }

        @Override
        public int hashCode() {
            return avatarPath != null ? avatarPath.hashCode() : 0;
        }
    }
}
